package futbol.tacticas.concursantes.newTeam;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Vector;

import futbol.Bola;
import futbol.Futbol;
import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoTiroAPuerta;

public class PersonalidadRebotador extends Personalitat {

	private static Logger log = Logger.getLogger(PersonalidadRebotador.class);
	
	double distanciaCritica;
	double yBola;
	double xBola;
	Point2D.Double porteriaContraria;

	private final int min;
	private final int max;
	
	public PersonalidadRebotador(int num,int yMin,int yMax,int fuerza,Tecnico tecnico)
	{
		super(num,160,(yMin+yMax)/2,fuerza,tecnico,null);
		min = yMin;
		max = yMax;
		
		porteriaContraria = new Point2D.Double(160,0);
		distanciaCritica = FutbolTools.getDistanciaCritica(fuerza);
	}
	@Override
	public Vector<Comando> getComandos()
	{
		PelotaAnalista pelota;
		ArrayList<PelotaAnalista> tray;
		Juegaytoma jugs[] = tecnico.getMejoresInterceptores();
		Vector<Comando> comandos = new Vector<Comando>();

		// Mirar de interceptar pilotes i rebre pases.
		tray = tecnico.getTrayectoria();
		pelota = tecnico.getPelotaAInterceptarTemporal(tray,this,velocidad,10);
		
		//if(pelota.distance(this) < 30)
		if(pelota.distance(porteriaContraria) < distanciaCritica+10 && pelota != tray.get(tray.size()-1) ) // 20% extra
		{
			
			comandos.add( new ComandoIrA(numero,pelota.x,pelota.y));
			//log.debug(numero + " - perseguir pilota");
		}
		else
		{
			//Per defecte posicionarnos.
			pelota = tecnico.getBola();
			//xBola = pelota.getX();
			yBola = Tecnico.trim(pelota.getY(), min, max);
			
			comandos.add( new ComandoIrA(numero,getXRespectandoDistancia(yBola),yBola) );
			//log.debug(numero + " - posicionarnos");
			
		}
		
		pelota = tecnico.getBola();
		
		// Si estem prou aprop intentar xutar.
		if(pelota.distance(this) <= 10)
		{
			//log.debug(numero+" - "+distanciaCritica+" - "+pelota.distance(porteriaContraria));

			if(pelota.distance(porteriaContraria) <= distanciaCritica)
			{
				comandos.add( new ComandoTiroAPuerta(numero,0) );
				log.debug(numero + " - tir a porta");
			}
			else
			{
				// anar fent toques fins a poder xutar.
				/*
				int vecX, vecY;
				vecX = (this.x > porteriaContraria.x)? -1 : 1 ;
				vecY = (this.y > porteriaContraria.y)? -1 : 1 ;
				
				double anglePorteria = FutbolTools.calcAngulo(pelota, 160,0);
				double newX = pelota.x+velocidad*Math.cos(anglePorteria);
				double newY = pelota.y+velocidad*Math.sin(anglePorteria);
				
				comandos.add( new ComandoGolpearBola(	numero,
														newX,
														newY) );
				comandos.add( new ComandoIrA(	numero,
												newX,
												newY) );
				
				////////////////////////
    			int index = sj.getContrarioMasCerca(numero);
    			Point enemigoCercano = sj.getContrario()[index];
    			
    			double anguloControl = -FutbolTools.calcAngulo(this,enemigoCercano);
    			
    			if(anguloControl>Math.PI/4 && anguloControl <7*Math.PI/4){
    				anguloControl = FutbolTools.calcAngulo(this,160,(int)this.y);
    			}

    			double xDeseado = (this.x+(Math.cos(anguloControl)*this.velocidad));
    			double yDeseado = (this.y+(Math.sin(anguloControl)*this.velocidad));
    			comandos.add(new ComandoIrA(numero, xDeseado*10, yDeseado*10));
    			
    			//Decido donde tiro la pelota
    			double[] puntoPreciso = FutbolTools.pasePreciso(this, pelota.getCopia(), xDeseado-5*Math.cos(anguloControl), yDeseado-5*Math.sin(anguloControl));
    			comandos.add(new ComandoGolpearBola(numero, puntoPreciso[0], puntoPreciso[1]));
				log.debug(numero + " - toques");
				 
				 */
				log.debug(numero + " - toques");
				
				Point2D.Double p;
				double[] posicion = new double[2];
				
				
				posicion = 	tecnico.irHaciaConEvasion(	this,
														tecnico.getRutasLibres(this, this.distance(porteriaContraria), porteriaContraria),
														porteriaContraria);
				
				if(posicion!=null)
				{
					comandos.add(new ComandoIrA(numero, posicion[0], posicion[1]));
					
					p = tecnico.getPosicionDeToque(posicion[0],posicion[1],pelota,1);
					double[] puntoPreciso = FutbolTools.toquePreciso(this, pelota.getCopia(), p.x, p.y);
					
					comandos.add(new ComandoGolpearBola(numero, puntoPreciso[0], puntoPreciso[1]));
					
				}
				else
				{
					Point2D pd;
					pd = tecnico.despejarPelota(this.numero);
        			comandos.add(new ComandoGolpearBola(this.numero, pd.getX(),pd.getY()));
				}
			}
			
			
			// sino marco
		}else{
//			si soc el millor o segon millor interceptor a por ella
			if(jugs[0].indiceJugador == numero)
			{
				//log.debug("jugador "+numero+"--> no tenim bola- millorInterceptor!"); 
	    		comandos.add(new ComandoIrA(numero, jugs[0].puntoObjetivo.getX() , jugs[0].puntoObjetivo.getY()));
			}
		
		}
		
		
		return comandos;
	}
	private int getXRespectandoDistancia(double Y)
	{
		//Y = Math.abs(Y);
		
		//log.debug("zona oval");
		return (int) Math.round( 160 + (distanciaCritica-20)*Math.cos( Math.PI - Math.asin(Y/(distanciaCritica-20)) ) );
		
		//return (int) Math.round( distanciaCritica );
	}
	

}
